<?php

/**
 * 城市联动Model
 */

namespace app\admin\model;

use categoryclass\Categoryclass;
use think\Model;

class Region extends Model
{
    protected $autoWriteTimestamp = false;
    //数据完成 字段定义
    protected $auto = ['parent_id', 'region_type'];
    //protected $insert = ['status' => 1];
    //protected $update = [];

    /**
     * 自动完成 parent_id
     * @param $value
     * @param $data
     * @return int
     */
    public function setParentIdAttr($value, $data)
    {
        if (empty($data)) return 1;
        //根据省份id和市的id判断对应的parent_id 是多少
        return ( isset($data['cityid']) && $data['cityid'] > 0 ) ? $data['cityid'] : (isset($data['provinceid']) ? $data['provinceid'] : 1);
    }

    /**
     * 自动完成 region_type 字段
     * @param $value
     * @param $data
     * @return int
     */
    public function setRegionTypeAttr($value, $data)
    {
        //根据省份id和市的id 是否存在，设置 1(省份) ---- 2(市) -----  3(区县)
        return ( isset($data['cityid']) && $data['cityid'] > 0 ) ? 3 : (isset($data['provinceid']) && $data['provinceid'] > 1) ? 2 : 1;
    }

    /**
     * 列表
     * @return mixed
     */
    public function _list()
    {
        return $this->where('id','>', '1')->select();
    }

    public function sort_list()
    {
        $list = $this->_list();
        return Categoryclass::catesort($list, 'parent_id', 'id', 1, 0 , '|—— ');
    }

    /**
     * 根据 id 获取父级id  -- 生成前台展示信息
     * @param $id
     * @return array|false|\PDOStatement|string|Model
     */
    public function getById($id)
    {
        //1. 父级 parent_id 为1 = 一级
        $data = $this->find($id);
        if ($data['parent_id'] == 1) {
            $data['province'] = 1;  //省份id
            $data['city'] = '';     //市的列表
            return $data;
        }
        //2. parent_id 不为  1时，---- 取出父级的父级 2.1 为 1 = 二级
        $parent = $this->where('id', $data['parent_id'])->find();
        if ($parent['parent_id'] == 1) {
            $data['province'] = $parent['id'];
            $data['city'] = '';
        }else {
            //2.2 不为1时， 三级
            $province = $this->where('id', $parent['parent_id'])->find();
            $data['province'] = $province['id'];

            // 省份的子地区 ------ 市的列表
            $son_list = $this->where('parent_id', $province['id'])->select();
            $html = '';
            foreach ($son_list as $v) {
                $str = ($v['id'] == $parent['id']) ? 'selected' : '';
                $html .= '<option value="'.$v['id'].'" '.$str.'>'.$v['name'].'</option>';
            }
            $data['city'] = $html;

        }

        return $data;
    }

    /**
     * 模型数据验证
     * @param $data
     * @return bool|string
     */
    public function data_verify($data)
    {
        $update = isset($data['id']) ? ['id' => $data['id']] : []; //是否更新操作
        $result = $this->validate(
            [
                'provinceid'    =>      'require|number',
                'cityid'        =>      'require|number',
                'name'          =>      'require|max:30',
            ],
            [
                'provinceid.require' => '省份不能为空 ',
                'provinceid.number' => '省份选择有误 ',
                'cityid.require' => '市不能为空 ',
                'cityid.number' => '市选择有误 ',
                'name.require' => '地区名称不能为空 ',
                'name.max' => '地区名称不能超过30个字符 ',
            ],
            [
                'add' => ['parent_id','name'],
            ]
        )->allowField(true)->save($data, $update);
        if(false === $result){
            //  验证失败 输出错误信息
            $error = $this->getError();
            if (is_array($error)) {
                return $error[key($error)];
            }else {
                return $error;
            }
        }
        return true;
    }

    /**
     * 删除
     */
    public function del($id){
        if (!$id || !is_int($id)) return false;
        $result = $this->get($id);
        //$result = Category::get($id);
        if(false !== $result){
            if ( $result->delete() ) {
                return true;
            }else {
                return false;
            }
        }else{
            return false;
        }
    }

    /**
     * 地区三级联动 省份列表
     * @param $type
     * @param $parent
     * @return false|\PDOStatement|string|\think\Collection
     */
    public function province($type, $parent)
    {
        return $this->where(['region_type' => $type, 'parent_id' => $parent])->select();//->cache(true)
    }

    /**
     * @param $parent_id
     * @return false|\PDOStatement|string|\think\Collection
     */
    public function city($parent_id)
    {
        return $this->where(['parent_id' => $parent_id])->select();//->cache(true)
    }

    /**
     * 地区三级联动
     * @param $type
     * @param $parent
     * @return false|\PDOStatement|string|\think\Collection
     */
    public function region($type,$parent)
    {
        return db('region')->where(array('region_type'=>$type,'parent_id'=>$parent))->limit(1)->select();//->cache(true)
    }
}